package busterminal.command.scheduleditem;

import busterminal.command.AbstractCommand;
import busterminal.entity.service.DaysOfWeek;
import busterminal.exception.BusinessException;
import busterminal.persistence.ScheduledItemDAO;
import busterminal.services.ServiceLocator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Команда для поиска пунктов расписания по дням осуществления рейсов
 */
public class FindScheduledItemByRoutingDaysCommand extends AbstractCommand {

    /**
     * Имя параметра "Дни осуществления рейсов"
     */
    private final static String PARAM_ROUTING_DAYS = "routing days (separated by comma) : " + DaysOfWeek.getValues();
    /**
     * Разделитель для параметра "Дни осуществления рейсов"
     */
    private final static String SEPARATOR = "\\s*,\\s*";
    /**
     * Регулярное выражение для проверки корректности ввода списка c элементами, разделёнными запятой
     */
    private static final String CORRECT_LIST_FORMAT = "^((\\s*)([A-Za-z]+)(\\s*),)*((\\s*)([A-Za-z]+)(\\s*))$";

    /**
     * Конструктор по умолчанию
     */
    public FindScheduledItemByRoutingDaysCommand() {
        super("Find scheduled item by routing days");
    }

    /**
     * Получить список имён параметров
     * @return список имён параметров
     */
    @Override
    public List<String> getParametersNames() {
        return Arrays.asList(PARAM_ROUTING_DAYS);
    }

    /**
     * Выполнить команду
     */
    @Override
    public void execute() {
        if (!parameters.get(PARAM_ROUTING_DAYS).matches(CORRECT_LIST_FORMAT)) {
            throw new BusinessException("Incorrect days list: '" + parameters.get(PARAM_ROUTING_DAYS).trim() + "'");
        }
        List<String> inputData = Arrays.asList(parameters.get(PARAM_ROUTING_DAYS).trim().toUpperCase().split(SEPARATOR));
        List<DaysOfWeek> foundDays = new ArrayList<DaysOfWeek>();
        for (String day : inputData) {
            try {
                foundDays.add(DaysOfWeek.valueOf(day));
            } catch (Exception e) {
                throw new BusinessException("Incorrect day name: '" + day + "'; " + e.toString(), e);
            }
        }

        ScheduledItemDAO scheduledItemDAO = ServiceLocator.getService(ScheduledItemDAO.class);
        System.out.println(scheduledItemDAO.findByRoutingDays(foundDays));
    }
}
